package FlappyBirds;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JOptionPane;
import javax.swing.JPanel;


/**
 * run部分：@author yb
 *   其他部分：@author bj
 *
 */
public class GamePanel extends JPanel implements Runnable {

	Image[] pics = new Image[5];//存储图片
	int imageX;//形像左上角x,y坐标
	int imageY;
	int width;//屏幕长宽
	int height;
	int backgroundX0 = 0;//背景的x轴起点
	int backgroundX1 = 600;//第二张背景拼凑的地方
	int nowStep = 40;//跳跃时，y坐标改变的大小
	int flag = 0;//是否跳跃中
	int score = 0;//记录分数
	int[] pipeXA = new int[5];//记录各个水管左上角的x坐标
	int[] pipeUpA = new int[5];//记录各个水管上半部分底部的y坐标
	int[] pipeDownA = new int[5];//记录各个水管下半部分顶部的y坐标

	public GamePanel(int kind) {
		width = 600;
		height = 600;
		imageX = width / 3 - 50;// x坐标，形象始终位于此
		imageY = height / 2;
		this.setPreferredSize(new Dimension(width, height));
		this.setVisible(true);
		getPics(kind);
		pipeData();
		this.addMouseListener(new MouseAdapter() {// 监听鼠标的单击事件
			@Override
			public void mousePressed(MouseEvent e) {
				flag = 1;
				nowStep = 40;//每一次的初始移动都为40
				repaint();
			}
		});
		new Thread(this).start();// this指GamePanel
	}

	private void pipeData() {// 设置管道中间通道大小

		for (int i = 0; i < 5; i++) {
			int pipeUp = (int) (Math.random() * 200 + 100);// pipeUp取值范围是100~300
			int pipeDown = pipeUp + 250;// pipeUp取值范围是350~550
			pipeXA[i] = width + 400 * i;// 每隔400放一个
			pipeUpA[i] = pipeUp;
			pipeDownA[i] = pipeDown;
		}
	}

	private void getPics(int kind) {// 根据用户选择读取形象和背景

		for (int i = 1; i < 3; i++) {
			pics[i] = Toolkit.getDefaultToolkit().getImage("D:\\Game\\FlappyBirdGame\\" + i + ".png");
		}
		pics[3] = Toolkit.getDefaultToolkit().getImage("D:\\Game\\FlappyBirdGame\\" + kind + ".png");
		if (kind == 3) {
			pics[0] = Toolkit.getDefaultToolkit().getImage("D:\\Game\\FlappyBirdGame\\" + 13 + ".png");
		} else if (kind == 4) {
			pics[0] = Toolkit.getDefaultToolkit().getImage("D:\\Game\\FlappyBirdGame\\" + 10 + ".png");
		} else if (kind == 5) {
			pics[0] = Toolkit.getDefaultToolkit().getImage("D:\\Game\\FlappyBirdGame\\" + 12 + ".png");
		} else if (kind == 6) {
			pics[0] = Toolkit.getDefaultToolkit().getImage("D:\\Game\\FlappyBirdGame\\" + 11 + ".png");
		} else if (kind == 7) {
			pics[0] = Toolkit.getDefaultToolkit().getImage("D:\\Game\\FlappyBirdGame\\" + 13 + ".png");
		} else if (kind == 8) {
			pics[0] = Toolkit.getDefaultToolkit().getImage("D:\\Game\\FlappyBirdGame\\" + 14 + ".png");
		}

	}


       //drawImage参数分别是：图，x坐标，y坐标，图宽度，图高度，转换需通知的对象（理解成绘制图的组件）

	@Override
	public void paint(Graphics g) {// 画各种图
		g.clearRect(0, 0, width, height);// 清屏
		g.drawImage(pics[0], backgroundX0, 0, width, height, this);// 从backgroundX0开始画背景
		g.drawImage(pics[0], backgroundX1, 0, width, height, this);// 同一背景接在后面使得背景连续
		g.drawImage(pics[3], imageX, imageY, 50, 50, this);// 人物
		for (int i = 0; i < 5; i++) {// 管道，宽度都为100
			g.drawImage(pics[1], pipeXA[i], 0, 100, pipeUpA[i], this);// 上管道
			g.drawImage(pics[2], pipeXA[i], pipeDownA[i], 100, height - pipeDownA[i], this);// 下管道
		}
	}

	/**
	 * 根据输入的坐标，进行碰撞检测，注意，y轴坐标从上往下是0->∞
	 * 规定碰到管道的标准为：当形象进入管道，且，形象上边界<=管道上边界或者形象下边界>=管道下边界
	 * @param i
	 * @return
	 */
	private boolean CollisionDetection(int i) {
		if(imageX > pipeXA[i] - 50 && imageX < pipeXA[i] + 100&& (imageY <= pipeUpA[i] || imageY + 50 >= pipeDownA[i])){
			return true;//碰到了
		}else {
			return false;//没碰到
		}
		
	}
	@Override
	public void run() {

		while (true) {
			try {
				backgroundX0 -= 10;// 移动背景
				backgroundX1 -= 10;
				imageY += 10;// 移动形象
				for (int i = 0; i < 5; i++) {
					pipeXA[i] -= 10;// 移动管道
					/**
					 * 规定通过管道的标志为：形象最左+5>管道右侧边缘线，且形象最左-5<管道右侧边缘线
					 */
					if (pipeXA[i] + 100 > imageX - 5 && pipeXA[i] + 100 <= imageX + 5) {
						score++;// 如果无触碰管道，加一分
						GameClient.helpPanel.setScore(score);
					}
					/**
					 * i管道消失在视线中的时候，如果i=0，则取下标为4，否则取下标i-1，随机设置一个管道，填入消失的i中
					 */
					if (pipeXA[i] < -100) {
						int index = i - 1 < 0 ? 4 : i - 1;// 获取当前位于最后的一根水管的下标
						int pipeUp = (int) (Math.random() * 200 + 100);// pipeUp取值范围是100~300
						int pipeDown = pipeUp + 250;// pipeDown取值范围是350~550
						pipeXA[i] = pipeXA[index] + 400;// 每隔400放一个
						pipeUpA[i] = pipeUp;
						pipeDownA[i] = pipeDown;
					}
					repaint();// 重新绘制界面

					
					if (CollisionDetection(i)==true) {//碰到管道
						int best = GameClient.helpPanel.getRecord();// 取最高记录
						int choice;
						if (score > best) {// 更新记录
							GameClient.helpPanel.writeRecord(score);// 写入记录
							choice = JOptionPane.showConfirmDialog(null,
									"你的分数是" + score + ",更新了历史记录" + best + "\n是否重新开始？", "游戏结束",
									JOptionPane.YES_NO_OPTION);// 获取用户选择
						} else {// 显示分数
							choice = JOptionPane.showConfirmDialog(null, "你的分数是" + score + "是否重新开始？", "游戏结束",
									JOptionPane.YES_NO_OPTION);// 获取用户选择
						}
						if (choice == 1) {
							System.exit(0);// 退出
						} else if (choice == 0) {// 重置数据
							pipeData();
							imageY = height / 2;
							flag = 0;
							score = 0;
							nowStep = 40;
							backgroundX0 = 0;
							backgroundX1 = width;
							GameClient.helpPanel.getRecord();
							GameClient.helpPanel.setScore(score);
						}
						break;
					}
				}

				if (flag == 1) {// 如果处于跳跃过程中
					if (imageY >= 0) {
						imageY -= nowStep;//向上跳40
					}
					nowStep -= 4;//如果没有连续点击，向上移动的距离慢慢减小直到为0
					if (nowStep == 0) {
						nowStep = 40;
						flag = 0;
					}
				}
				if (backgroundX0 == -width) {//如果背景移除视线外，重新将它拼到右侧
					backgroundX0 = width;
				}
				if (backgroundX1 == -width) {//如果背景移除视线外，重新将它拼到右侧
					backgroundX1 = width;
				}
				Thread.sleep(50);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}
